home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 August: Tool Chest / Dev.CD Aug 00 TC Disk 2.toast / pc / sample code / interapplication comm / 7edit / source / svaemove.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-23  |  5.2 KB  |  196 lines

  1. /*
  2.     File:        SVAEMove.c
  3.  
  4.     Contains:    
  5.  
  6.     Written by: Original version by Jon Lansdell and Nigel Humphreys.
  7.                 3.1 updates by Greg Sutton.
  8.  
  9.     Copyright:    Copyright © 1995-1999 by Apple Computer, Inc., All Rights Reserved.
  10.  
  11.                 You may incorporate this Apple sample source code into your program(s) without
  12.                 restriction. This Apple sample source code has been provided "AS IS" and the
  13.                 responsibility for its operation is yours. You are not permitted to redistribute
  14.                 this Apple sample source code as "Apple sample source code" after having made
  15.                 changes. If you're going to re-distribute the source, we require that you make
  16.                 it clear in the source that the code was descended from Apple sample source
  17.                 code, but that you've made changes.
  18.  
  19.     Change History (most recent first):
  20.                 7/20/1999    Karl Groethe    Updated for Metrowerks Codewarror Pro 2.1
  21.                 
  22.  
  23. */
  24.  
  25. #include "SVAEMove.h"
  26.  
  27. #include "SVEditAEUtils.h"
  28. #include "SVEditWindow.h"        // for DPtrFromWindowPtr()
  29. #include "SVAETextUtils.h"
  30.  
  31. #include "SVAEDelete.h"
  32. #include "SVAECreate.h"
  33. #include "SVAEGetData.h"
  34.  
  35.  
  36. #pragma segment AppleEvent
  37.  
  38.  
  39. pascal OSErr    DoMove(const AppleEvent *theAppleEvent, AppleEvent *reply, long  handlerRefCon)
  40. {
  41. #pragma unused(handlerRefCon)
  42.  
  43.     AEDesc        directObj = {typeNull, NULL},
  44.                 insertHereDesc = {typeNull, NULL},
  45.                 resultDesc = {typeNull, NULL};
  46.     OSErr        err;
  47.  
  48.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  49.     if (noErr != err) goto done;
  50.  
  51.     err = AEGetParamDesc(theAppleEvent, keyAEInsertHere, typeWildCard, &insertHereDesc);
  52.     if (noErr != err) goto done;
  53.  
  54.         // missing any parameters?
  55.     err = GotRequiredParams(theAppleEvent);
  56.     if (noErr != err) goto done;
  57.     
  58.     err = MoveDesc(&directObj, &insertHereDesc, &resultDesc);
  59.     if (noErr != err) goto done;
  60.     
  61.     err = AddResultToReply(&resultDesc, reply, err);
  62.  
  63. done:
  64.     if (directObj.dataHandle)
  65.         AEDisposeDesc(&directObj);
  66.     if (insertHereDesc.dataHandle)
  67.         AEDisposeDesc(&insertHereDesc);
  68.         
  69.     return(err);
  70. }
  71.  
  72. OSErr    MoveTextToken(TextToken* token, AEDesc* insertHereDesc, AEDesc* result)
  73. {
  74.     TextToken        insertAtToken;
  75.     AEDesc            dataDesc = {typeNull, NULL},
  76.                     insertDesc = {typeNull, NULL},
  77.                     propertyDesc = {typeNull, NULL};    // Use to pass no properties
  78.     DescType        insertType;
  79.     short            numPartial;
  80.     OSErr            err;
  81.  
  82.                         // Get the data descriptor to insert
  83.     err = GetTextTextProperty(token, &dataDesc);
  84.     if (noErr != err) goto done;
  85.  
  86.                         // Get the place to insert it
  87.      err = GetInsertDescFromInsertHere(insertHereDesc, &insertDesc, &insertType);
  88.     if (noErr != err) goto done;
  89.     
  90.     if (typeNull == insertType)        // Default to setting the selection in the front window
  91.         err = errAETypeError;        // GetWindowSelection(FrontWindow(), &insertAtToken, &oldLength);
  92.     else                            // Otherwise get a selection from the insertDesc
  93.         err = GetInsertToken(&insertDesc, insertType, &insertAtToken);
  94.         
  95.     if (noErr != err) goto done;
  96.     
  97.                         // Sort out any moving onto self scenarios
  98.                         // and offsets changing due to deletion of where it was
  99.     switch (TokenWithinToken(token, &insertAtToken, &numPartial))
  100.     {
  101.         case kTokenBefore:
  102.                     // Do Nothing
  103.             break;
  104.  
  105.         case kTokenAfter:
  106.                     // Balance up for delete
  107.             insertAtToken.tokenOffset -= token->tokenLength;
  108.             break;
  109.             
  110.         case kTokenWithin:
  111.                     //    tell document 1 of application "7Edit"
  112.                     //        move first word to last character of first word
  113.                     //    end tell
  114.             insertAtToken.tokenOffset = token->tokenOffset;
  115.             insertAtToken.tokenLength = 0;
  116.             break;
  117.  
  118.         case kTokenPartialBefore:
  119.             insertAtToken.tokenLength -= numPartial;
  120.             break;
  121.             
  122.         case kTokenPartialAfter:
  123.             insertAtToken.tokenOffset = token->tokenOffset;
  124.             insertAtToken.tokenLength -= numPartial;
  125.             break;
  126.     }
  127.     
  128.                 // Delete the text to be moved
  129.     err = DeleteTextToken(token);
  130.     if (noErr != err) goto done;
  131.     
  132.                 // Secondly create the text wherever
  133.     err = CreateAtTextToken(cText, &dataDesc, &insertAtToken, &propertyDesc, result);
  134.     if (noErr != err) goto done;
  135.  
  136. done:
  137.     if (dataDesc.dataHandle)
  138.         AEDisposeDesc(&dataDesc);
  139.  
  140.     return(err);
  141. }
  142.  
  143. OSErr    MoveTextDesc(AEDesc* textDesc, AEDesc* insertHereDesc, AEDesc* result)
  144. {
  145.     TextToken        aTextToken;
  146.     Size            actualSize;
  147.     OSErr            err;
  148.  
  149.     if (typeMyText != textDesc->descriptorType)
  150.         return(errAETypeError);
  151.         
  152.     GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  153.     
  154.     err = MoveTextToken(&aTextToken, insertHereDesc, result);
  155.     
  156.     return(err);
  157. }
  158.  
  159. OSErr    MoveDesc(AEDesc* aDesc, AEDesc* insertHereDesc, AEDesc* result)
  160. {
  161.     AEDesc        moveDesc = {typeNull, NULL},
  162.                 textDesc = {typeNull, NULL};
  163.     OSErr        err;
  164.     
  165.     if (typeObjectSpecifier == aDesc->descriptorType)
  166.         err = AEResolve(aDesc, kAEIDoMinimum, &moveDesc);
  167.     else
  168.         err = AEDuplicateDesc(aDesc, &moveDesc);
  169.         
  170.     if (noErr != err) goto done;
  171.     
  172.     switch (moveDesc.descriptorType)
  173.     {
  174.         case typeAEList:
  175.             err = errAETypeError;
  176.             // We can't handle moving more than one item because as
  177.             // soon as one item is moved all the rest of the tokens
  178.             // are likely to have their offsets messed up.
  179.             // No doubt it can be done though…
  180.             break;
  181.             
  182.         default:
  183.             err = AECoerceDesc(&moveDesc, typeMyText, &textDesc);
  184.             if (noErr != err) goto done;
  185.             err = MoveTextDesc(&textDesc, insertHereDesc, result);
  186.     }
  187.     
  188. done:
  189.     if (moveDesc.dataHandle)
  190.         AEDisposeDesc(&moveDesc);
  191.     if (textDesc.dataHandle)
  192.         AEDisposeDesc(&textDesc);
  193.     
  194.     return(err);
  195. }
  196.